package com.example.kotlindemo.demo

/**
 * Author zss
 *2022/8/4 11:00
 *
 *Unit1
 *describe：Kotlin的基础语法
 **/
class Unit1{
    /**
     * 1.函数的定义
     */
//函数的格式如下
    fun sum(a: Int, b: Int): Int { //Int 为函数的返回值
        return a + b;
    }

    //表达式作为函数体，返回的值可以自动判断
    fun sum1(a: Int, b: Int) = a + b;
    public fun sum2(a: Int, b: Int): Int = a - b;

    //无返回值的函数为Unit，该类型可以省略
    fun printFun(str: String): Unit {
        println(str)
    }

    /**
     * 2.可变长参数可以使用ararg表示
     */
    fun vars(vararg v: Int) {
        for (i in v) {
            println(i)
        }
    }

    /**
     * 3.lambda匿名函数
     * 格式：val 方法名: (参数1类型，参数2类型) -> 返回的类型 = {参数1，参数2 -> 表达式}
     */
    val lambdaFun: (String, String) -> String = { x, y -> x + y }

    /**
     * 4.定义常量与变量
     * 可变的变量定义：var
     * 不可变变量定义：val，只能赋值一次的变量
     */
    fun varAndvalFun() {
        var i: Int;
        i = 1
        println(i)
        i = 2
        println(i)
        val j: Int
        j = 1
//    j=3
        println(j)
    }

    /**
     * 字符串模版
     */
    fun showStr(a: String): Unit {
        var b = "$a"
        println(b)
        var c = "";
        if (b.length > 4) {
            c = "${b.substring(2, b.length)}" + "end"
        }
        println(c)

    }

    /**
     * Null检查机制
     */
    fun nullFun(string: String) {
        //类型后面加?表示可为空
        var str: String? = "$string"
        //不做处理返回null
        var value1 = str?.length
        //value2的返回值是13
        var value2 = str?.length ?: 13
        //抛出异常
        var value3 = str!!.toInt()

        println(value1)
        println(value2)
        println(value3)
    }

    //当一个引用可能为null值的时候，声明的标记必须为可以为null
//当a不是一个整数的时候返回null
    fun paresInt(a: String): Int? {
        return a.toIntOrNull()
    }

    fun show(m: String, n: String) {
        var x = paresInt(m)
        var y = paresInt(n)
        if (x != null && y != null) {
            println(x * y)
        } else {
            println("one of x or y is not a number")
        }
    }

    /**
     * 类型检测以及类型自动转换
     */
    fun getStr(obj: Any): Int? {
        if (obj is String) {
            //obj会被自动转为String
            println("1:" + obj.javaClass.name)
        } else {
            println("2:" + obj.javaClass.name)
            return null
        }
        //obj会被自动转为String
        println("3:" + obj.javaClass.name)
        return null
    }

    fun getStringLength(obj: Any): Int? {
        if (obj !is String)
            return null
        // 在这个分支中, `obj` 的类型会被自动转换为 `String`
        println(obj.javaClass.name)
        return obj.length
    }

    /**
     * 区间：区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。
     *区间是为任何可比较类型定义的，但对于整型原生类型，它有一个优化的实现。
     */
    fun rangeFun() {
        //循环打印
        println("循环打印")
        for (i in 1..10){
            println(i)
        }
        //使用downTo
        println("使用downTo")
        for (i in 10 downTo 1){
            println(i)
        }
        //使用step
        println("使用step")
        for (i in 1..10 step 2){
            println(i)
        }
        //use until
        println("until")
        for (i in 1 until 10 ){
            println(i)
        }
        //结合：combine
        println("combine")
        for (i in 1 until 10 step 2){
            println(i)
        }
    }

}
